#if !defined(__APP_BUFFER_H)
#define __APP_BUFFER_H

#include <pthread.h>

/* 读/写（小/子）缓冲区 */
typedef struct {
    unsigned char *ptr;  // 容器内存指针
    int size;   // 容器大小
    int len;    // 当前长度
} SubBuffer;

/* 缓冲区 */
typedef struct {
    SubBuffer *sub_buffers[2];  // 包含读写缓冲区
    int read_index;        // 读缓冲区索引
    int write_index;       // 写缓冲区索引
    pthread_mutex_t read_mutex; // 读锁
    pthread_mutex_t write_mutex; // 写锁
} Buffer;

/**
 * @brief 初始化缓冲区
 * 
 * @param size 缓冲区大小
 * @return Buffer* 缓冲区指针
 */
Buffer *app_buffer_init(int size);

/**
 * @brief 释放缓冲区
 * 
 * @param buffer 缓冲区指针
 */
void app_buffer_free(Buffer *buffer);

/**
 * @brief 向缓冲区写入数据
 * 
 * @param buffer 写入的缓冲区
 * @param data 写入的数据
 * @param len 写入数据的长度
 * @return int 0：成功，-1：失败
 */
int app_buffer_write(Buffer *buffer, char *data, int len);

/**
 * @brief 从缓冲区读取数据
 * 
 * @param buffer 读取的缓冲区
 * @param data_buf 存放读出数据的buffer
 * @param buf_size buffer大小
 * @return int 读出数据的实际长度
 */
int app_buffer_read(Buffer *buffer, char *data_buf, int buf_size);

#endif // __APP_BUFFER_H
